package cn.itcast.controller;

import cn.itcast.domain.system.FeedBack;
import cn.itcast.domain.system.Module;
import cn.itcast.domain.system.User;
import cn.itcast.service.system.FeedService;
import cn.itcast.service.system.ModuleService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.List;

@Controller
public class LoginController{

    @Autowired
    private HttpServletRequest request;
    @Autowired
    private HttpSession session;
    @Autowired
    private ModuleService moduleService;

    @Autowired
    private FeedService feedService;

    @RequestMapping(value = "/login",name = "登陆判断")
    public String login(String email,String password) {

        //1.email和password不能为空
        if (StringUtils.isEmpty(email) || StringUtils.isEmpty(password)) {

            //有一个为空，在页面中进行错误提示
            //向request域中存入错误信息
            request.setAttribute("error", "邮箱或密码为空···");
            //重定向到登陆页面
            return "forward:/login.jsp";
        }

        /**
         * info，仅仅是当前用户数据算出来的值，
         * login会根据登陆信息创建一个token，就是login方法的参数，
         * shiro会校验info和token
         *
         * 例如：一个人要做火车，而必须要有火车票
         *       坐车前，必须先买票，（车站根据个人信息打印车票）---token  坐车的凭证
         *       坐车.login(车票)
         *       shiro相当于检票机，校验身份，系统中是否有该用户车票信息(info)和车票(token)
         * */
        //把页面上输入的明文密码转成密文
        password = new Md5Hash(password,email,2).toString();
        //使用shiro的认证方式 1.创建令牌  2.获取主题  3.开始认证
        //1.创建令牌
        UsernamePasswordToken token = new UsernamePasswordToken(email, password);
        //2.获取主题
        Subject subject = SecurityUtils.getSubject();
        //开始认证
        try {

            subject.login(token);
           /**
            * 执行到这句代码时，进入 DelegatingSubject implements Subject的 login方法
             *  public void login(AuthenticationToken token) throws AuthenticationException {
                   this.clearRunAsIdentitiesInternal();
                   Subject subject = this.securityManager.login(this, token);

            DelegatingSubject的login方法-----》AuthenticatingRealm 的getAuthenticationInfo方法（比较token、info是否为空）······
             一路向下追踪源码，比较先info和token是否为空，都不为空，再判断subject是否为空，
             均不为空，再层层返回，确定所有信息都匹配，结束subject.login(token);
            继续往下执行 ------进入SaasRealm中，进行认证，返回SimpleAuthenticationInfo对象
            ----跳出代码块，继续向下执行
            }
            * */

        } catch (AuthenticationException e) {
            e.printStackTrace();
            request.setAttribute("error","邮箱或者密码错误");
            return "forward:login.jsp";
        }

        //获取主角：当前登陆人
        User user = (User) subject.getPrincipal();
        //把当前登陆人放入到session
        session.setAttribute("loginUser",user);
        List<Module> moduleList = moduleService.findModuleListByUser(user);
        session.setAttribute("modules",moduleList);

        //当用户登陆时就查询所收到的邮件总个数，存放到session域中
        List<FeedBack> list = null;
        //User loginUser =(User) session.getAttribute("loginUser");
        //企业管理员---根据公司id查询
        if (user.getDegree()==1){

            list = feedService.findTotalMessageByCompanyId(user.getCompanyId(),user.getEmail());
        }
        //SaaS管理员---根据degree查询
        if (user.getDegree()==0){

            list = feedService.findTotalMessageByDegree(1);
        }
        session.setAttribute("list",list);
        //设置用户登录时间
        Date loginDate = new Date();
        session.setAttribute("loginDate",loginDate);
        return "home/main";

    }

        /*//2.根据email查询用户
        User user = userService.findByEmail(email);
        if (user==null){

            request.setAttribute("error","邮箱输入错误，请重新输入···");
            //重定向到登陆页面
            return "forward:/login.jsp";
        }
        else {

            //3.email正确--检查密码
            //需要先把页面上的明文密码进行加盐加密，再和数据库中的密码进行比较
            String password_page = new  Md5Hash(password,user.getEmail(),2).toString();
            if (!user.getPassword().equals(password_page)){

                request.setAttribute("error","密码输入错误，请重新输入···");
                //重定向到登陆页面
                return "forward:/login.jsp";
            }

        }


        //4.email和password都正确，跳转到home/main页面
        session.setAttribute("loginUser",user);

        //根据登陆用户查询模块信息
        List<Module> moduleList = moduleService.findModuleListByUser(user);
        session.setAttribute("modules",moduleList);
        return "home/main";
    }*/

    //退出
    @RequestMapping(value = "/logout",name="退出当前帐户")
    public String logout(){
        //退出当前登录账户
        //如果不声明shiro进行退出，shiro会认为当前用户还未退出，仍能查询信息
        SecurityUtils.getSubject().logout();
        return "forward:login.jsp";
    }

    @RequestMapping(value = "/home")
    public String home(){

        return "home/home";
    }




}
